# __radd__：
# 当两个对象相加的时候，如果左侧的对象和右侧的对象不同类型，并且左侧的对象没有定义 __add__ 方法，
# 或者其 __add 方法返回 NotImplemented，那么Python就会取右侧的对象中查找是否有 __radd__ 方法的定义


class S1(str):

    def __add__(self, other):
        # 不实现该方法
        return NotImplemented


class S2(str):

    def __radd__(self, other):
        # __radd__：
        # 当两个对象相加的时候，如果左侧的对象和右侧的对象不同类型，并且左侧的对象没有定义 __add__ 方法，
        # 或者其 __add 方法返回 NotImplemented，那么Python就会取右侧的对象中查找是否有 __radd__ 方法的定义
        return len(self) + len(other)


s1 = S1("Apple")
s2 = S2("Banana")
print(s1 + s2)  # 11

s3 = S1("Pear")
print(s1 + s3)  # TypeError: unsupported operand type(s) for +: 'S1' and 'S1'
